From: Keir Fraser Date: Fri, 25 Nov 2011 20:32:05 +0000 (+0000) Subject: waitqueue: Hold a reference to a domain on a waitqueue. X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=d93b583113fd9835960cd1479220e16e79d7081a;p=xen.git waitqueue: Hold a reference to a domain on a waitqueue. Also allow waitqueues to be dynamically destroyed. Signed-off-by: Keir Fraser --- diff --git a/xen/common/wait.c b/xen/common/wait.c index a05ac4f57f..2fb2309ac0 100644 --- a/xen/common/wait.c +++ b/xen/common/wait.c @@ -87,6 +87,11 @@ void init_waitqueue_head(struct waitqueue_head *wq) INIT_LIST_HEAD(&wq->list); } +void destroy_waitqueue_head(struct waitqueue_head *wq) +{ + wake_up_all(wq); +} + void wake_up_nr(struct waitqueue_head *wq, unsigned int nr) { struct waitqueue_vcpu *wqv; @@ -98,6 +103,7 @@ void wake_up_nr(struct waitqueue_head *wq, unsigned int nr) wqv = list_entry(wq->list.next, struct waitqueue_vcpu, list); list_del_init(&wqv->list); vcpu_unpause(wqv->vcpu); + put_domain(wqv->vcpu->domain); } spin_unlock(&wq->lock); @@ -218,6 +224,7 @@ void prepare_to_wait(struct waitqueue_head *wq) spin_lock(&wq->lock); list_add_tail(&wqv->list, &wq->list); vcpu_pause_nosync(curr); + get_knownalive_domain(curr->domain); spin_unlock(&wq->lock); } @@ -236,6 +243,7 @@ void finish_wait(struct waitqueue_head *wq) { list_del_init(&wqv->list); vcpu_unpause(curr); + put_domain(curr->domain); } spin_unlock(&wq->lock); } diff --git a/xen/include/xen/wait.h b/xen/include/xen/wait.h index f16eb6a114..6eb7667d9c 100644 --- a/xen/include/xen/wait.h +++ b/xen/include/xen/wait.h @@ -25,8 +25,9 @@ struct waitqueue_head { .list = LIST_HEAD_INIT((name).list) \ } -/* Dynamically initialise a waitqueue. */ +/* Dynamically initialise/destroy a waitqueue. */ void init_waitqueue_head(struct waitqueue_head *wq); +void destroy_waitqueue_head(struct waitqueue_head *wq); /* Wake VCPU(s) waiting on specified waitqueue. */ void wake_up_nr(struct waitqueue_head *wq, unsigned int nr);